Cette documentation présentera en détail l’architecture fondamentale requise pour mettre en place la fédération de CO avec le protocole ActivityPub. Elle expliquera les différents composants nécessaires et sa mise en œuvre.
L’implémentation se trouve dans le module citizenToolKit, plus précisément dans le dossier components/activitypub. Elle utilise l’espace de noms PixelHumain\PixelHumain\modules\citizenToolKit\components\activitypub.
Le dossier racine contient trois sous-dossiers ainsi qu’un fichier de configuration :
Ce dossier contient les mises en œuvre de tous les types recommandés dans Activitystream 2.0 vocabulary, classés selon lecore type et le extend type.
La figure ci-dessous montre le diagramme de classe de types qu’on a implémenté:
.
Ce dossier contient les classes qui gèrent les activités entrantes et sortantes de la fédération. Il y a une classe commune pour la gestion des événements appelée "Handler.php". Cette classe distribue les activités et appelle automatiquement la classe "handler" qui est responsable de l’activité en cours. Pour cela, la classe "handler" doit suivre les règles suivantes :
handlers/activity. Par exemple, si on veut gérer les activités de type create, il faut placer le handler dans handlers/create.ActivityObjectHandler, c’est-à-dire la concaténation du type d’activité, du type d’objet et du mot Handler. Par exemple, si on veut gérer l’activité de création d’une note, il faut créer une classe qui s’appelle CreateNoteHandler.AbstractHandler et doit implémenter les deux méthodes suivantes :![]()
Ce dossier contient uniquement les classes utilitaires nécessaires à notre application, notamment :
Ce fichier contient juste la configuration HOSTNAME de notre instance.
Pour faire fonctionner ActivityPub, nous avons créé trois nouvelles collections :
Il s’agit d’une collection qui permet de stocker les différents flux d’activités. Elle comporte quatre entrées :
Cette collection ne contient que les objets des activités fédérées par d’autres plateformes. Elle sert de cache pour garantir que les objets seront toujours disponibles même si l’instance source est indisponible. Elle se compose de seulement deux entrées, à savoir :
Cette collection permet d’enregistrer les activités des utilisateurs locaux afin de les envoyer ultérieurement via une tâche cron. Cela permet d’éviter aux utilisateurs d’attendre le processus de fédération. La collection contient 5 entrées :
La première étape consiste à résoudre une ressource de type user@domain en utilisant l’endpoint /.well-known/webfinger?resource=slug@domain. Cela devrait renvoyer le webfinger de la ressource demandé.
Pour notre cas, l’alias /.well-known/webfinger?resource=slug@domain est redirigé vers /api/activitypub/webfinger. On a utilise PixelHumain\PixelHumain\modules\api\controllers\ActivitypubController comme controlleur et \PixelHumain\PixelHumain\modules\api\controllers\activitypub\WebfingerAction comme action.
Le WebFinger doit renvoyer un lien qui permet de récupérer les informations relatives à la ressource en question. Cela nécessite la création d’un point d’accès qui renvoie les informations de cette ressource. Dans notre cas, cet point d’accès est /api/activitypub/users/u/slug. On utilise l’action \PixelHumain\PixelHumain\modules\api\controllers\activitypub\GetActorAction.
Pour qu’on puisse faire la redirection de /.well-known/webfinger?resource=slug@domain vers /api/activitypub/webfinger il faut qu’on fasse une réecriture d’url dans .htaccess.
RewriteEngine On
RewriteCond %{REQUEST_URI} /\.well-known/webfinger$
RewriteCond %{QUERY_STRING} resource=([^&]+)
RewriteRule ^(.*)$ /wf/%1.json [L]
RewriteRule ^/.well-known/webfinger$ - [L,R=400]
Remarque:
Pour obtenir le format JSON pour chaque ressource demandée, il est nécessaire d’ajouter .json à la fin de l’URL. Par exemple, pour accéder à la ressource /api/activitypub/users/u/slug, il faudrait faire /api/activitypub/users/u/slug.json
Pour générer le WebFinger d’une ressource, il suffit d’utiliser la classe WebFinger pour l’analyser et le créer renvoyer le PixelHumain\PixelHumain\modules\citizenToolKit\components\activitypub\handlers\Webfinger qui correspond à la ressource demandé.
L’« inbox » le point d’entré à notre instance, il est accèssible via /api/activitypub/inbox/u/slug, et l’action correspondante est le PixelHumain\PixelHumain\modules\api\controllers\activitypub\InboxAction.
Lorsqu’une activité est reçue, la méthode PixelHumain\PixelHumain\modules\citizenToolKit\components\activitypub\type\Type::create est appelée dans l’« InboxAction » pour créer une instance du type correspondant. Ensuite, la méthode PixelHumain\PixelHumain\modules\citizenToolKit\components\activitypub\handlers\Handler::handle est utilisée pour dispatcher l’activité vers le gestionnaire qui lui correspond.
…